Cash 實在不想再看到Fields為新學Linux 相關技能,擺出那張可憐兮兮的臉,決定消化好 Docker 的知識後,給一個最濃縮的使用說明,要大家會用就好,至於背後的知識,等他們問了再說吧!
想想還是請大家花半小時Docker 基本概念。再表演一下如何使用別人已經設置好的支援GPU的 Tensorflow Docker image,這個 image 要好幾GB的下載,但是只要有一人下載過,就不用重複下載
docker run --runtime=nvidia -it -p 8888:8888 tensorflow/tensorflow:latest-gpu-py3
然後請大家嘗試連到 http://10.1.1.100:8888 ,大家看到後頗驚豔,原來這麼簡單就可以有完整的Jupyter Notebook,不僅 Tensoflow, Jupyter 安裝好了,也可以在GPU環境下執行。
要結束 Jupyter Notebook 連續按 兩次 CTRL+C 即可。
他又再次執行已經被設置好的支援GPU的 Mxnet 的 image
docker run --runtime=nvidia -it mxnet/python:1.3.0_gpu_cu90_mkl_py3
這次是出現 Linux 文字控制台的畫面:
root@345b3c9a40af:/#
他提醒大家看到『#』符號一般是以 root 權限下指令,要謹慎以免毀掉整個系統,他表演給大家可以嘗試在此Container 更新系統,安裝新的套裝等等
apt update #無須加 sudo,因為本身就是 root
apt upgrade
python3
這樣就進入 python 3 的交互界面 『>>>』,可以開始練習 Mxnet 的程式。按下 CTRL+D可離開 python 3。 然後可以安裝先前在 Conda 安裝的一些套件。
pip3 install -U pip
pip install jupyter notedown request pandas matplotlib gluonbook
Molly 問到:”那是否就不需要 conda,看來每個 Container 都是很獨立的系統,不會有版本的干擾?“ 。 Cash 覺得還是可以再加一層 Conda ,畢竟Conda套件管理有其用處。
緊接著 Cash 拋出一個較為完整的 Docker 啟動 (docker run) 指令來說明
docker run -t -i --runtime=nvidia \
-p 8888:8888 -p 6006:6006 \ #Jupyter 與 Tensorboard 預設 port
--name=mxnet \
-v ~:/media \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
--workdir /media \
mxnet/python:1.3.0_gpu_cu92_py3 \
bash
並開始解釋這些docker run參數用途:
-t -i #提供交互式虛擬 TTY,通俗講模擬文字終端機以控制Container
--runtime=nvidia #如要啟動的 Container 須用到 GPU 資源,則藉此宣告
-p #將Container 裡面用到的 port,對外暴露成哪個 port。 -p outPort:ContainerPort
--name #為這個Container 取個易記的名子,後續操作用
-v #將主機上的目錄映射成Container 的一個新目錄,這樣Container 才能讀取已存在主機的檔案
-v /etc/localtime… #連續兩行的目的是讓 Container 的時區與主機時區一致。
--workdir #啟動 Container 後,立即進入此目錄
mxnet/python:1.… #Container 啟動所依賴的 Image,hub.docker.com 有許多可開箱即用的
bash #啟動Container 後立即執行的程式
一旦啟動了 Container,可再用 termius 或是 puTTY 的終端機程式ssh 到 Server (ip 假設 ),下其他指令來操作 Container。常用的指令有:
docker images -a #查看主機已儲存哪些 image 可直接用
docker ps -a #主機還活著的 Container,有時需要關掉(刪除) Container 就需要先查
docker rm CONTAINER_NAME #關掉(刪除)Container,如須保存設定,必須下 docker commit…
docker rmi IMAGE_NAME #刪掉用不到的 image 釋放硬碟空間
docker stop CONTAINER_NAME #暫停 container
docker start -i CONTAINER_NAME #恢復被暫停的Container, 並進入TTY
docker exec -t -i CONTAINER_NAME bash #連結到已經啟動的 Container
docker commit CONTAINER_NAME NEW_IMAGE:TAG #將組態已經有變動的container 另製作新的 image
要下 docker rm 前,如果已經對Container有相當的設定安裝,或是存放資料,記得要下docker commit 創見新的 image 來保留先前Container的變動。下次啟動改成 docker run -t … NEW_IMAGE bash 即可。
專案緣起記錄在 【UP, Scrum 與 AI專案】